package com.fps.webshop.question.question0800_0899;

import java.util.HashMap;
import java.util.Map;

/**
 * 819. 最常见的单词
 * 
 * 给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多，同时不在禁用列表中的单词。
 * 题目保证至少有一个词不在禁用列表中，而且答案唯一。
 * 禁用列表中的单词用小写字母表示，不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
 * 
 * 示例：
 * 输入: 
 * paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
 * banned = ["hit"]
 * 输出: "ball"
 * 解释: 
 * 		"hit" 出现了3次，但它是一个禁用的单词。
 * 		"ball" 出现了2次 (同时没有其他单词出现2次)，所以它是段落里出现次数最多的，且不在禁用列表中的单词。 
 * 		注意，所有这些单词在段落里不区分大小写，标点符号需要忽略（即使是紧挨着单词也忽略， 比如 "ball,"）， 
 * 		"hit"不是最终的答案，虽然它出现次数更多，但它在禁用单词列表中。
 * 
 * 提示：
 * 		1 <= 段落长度 <= 1000
 * 		0 <= 禁用单词个数 <= 100
 * 		1 <= 禁用单词长度 <= 10
 * 		答案是唯一的, 且都是小写字母 (即使在 paragraph 里是大写的，即使是一些特定的名词，答案都是小写的。)
 * 		paragraph 只包含字母、空格和下列标点符号!?',;.
 * 		不存在没有连字符或者带有连字符的单词。
 * 		单词里只包含字母，不会出现省略号或者其他标点符号。
 */
public class Question819 {
	
	/**
	 * 第一次提交，用了太多次循环
	 * 提交结果	执行用时	内存消耗	语言		提交时间				备注
	 * 通过		7 ms	38.4 MB	Java	2021/08/04 15:28
	 */
	public static String mostCommonWord(String paragraph, String[] banned) {
		paragraph = paragraph.replace("!", " ")
				.replace("?", " ")
				.replace("'", " ")
				.replace(",", " ")
				.replace(";", " ")
				.replace(".", " ");
		Map<String,Integer> map = new HashMap<String,Integer>();
		Map<String,Integer> bannedMap = new HashMap<String,Integer>();
		for(String ban: banned) {
			if(ban!=null) {
				ban = ban.toLowerCase();
				bannedMap.put(ban, 1);
			}
		}
		
		String[] words = paragraph.split(" ");
		for(String word : words) {
			word = word.toLowerCase();
			if(word!=null&&!"".equals(word)) {
				word = word.toLowerCase();
				if(!bannedMap.containsKey(word)) {
					if(map.containsKey(word)) {
						map.put(word, map.get(word)+1);
					}else {
						map.put(word, 1);
					}
				}
			}
		}
		String theword = null;
		Integer thetime = 0;
		for(Map.Entry<String,Integer> eeee : map.entrySet()) {
			if(thetime==0) {
				theword = eeee.getKey();
				thetime = eeee.getValue();
			}else {
				if(eeee.getValue()>thetime) {
					theword = eeee.getKey();
					thetime = eeee.getValue();
				}
			}
		}
		return theword;
    }
	
	public static void main(String[] args) {
		String paragraph = "Bob. hIt, baLl";
		String[] banned = new String[] {"bob", "hit"};
		System.out.print(mostCommonWord(paragraph,banned));
	}
}
